本篇主要介紹 POST 和 GET 觸發檔案下載的方式。
1. 使用表單送出的方式 (POST)
<form id="form1" runat="server">
    <div>
        <button type="button" id="download_btn">下載檔案 (POST)</button>
    </div>
</form>
<script>
    document.getElementById("download_btn").onclick = function () {
        //檔案下載網址
        var url = "/Download.ashx";
        
        //產生 form
        var form = document.createElement("form");
        form.method = "POST";
        form.action = url;
        //如果想要另開視窗可加上target
        //form.target = "_blank";
        //index為要下載的檔案編號,存入hidden跟表單一起送出
        var input = document.createElement("input");
        input.type = "hidden";
        input.name = "index";
        input.value = "1";
        form.appendChild(input);
        //送出表單並移除 form
        var body = document.getElementsByTagName("body")[0];
        body.appendChild(form);
        form.submit();
        form.remove();
    };
</script>
2. 使用超連結的方式 (GET)
<form id="form1" runat="server">
    <div>
        <a id="download_btn">下載檔案 (GET)</a>
    </div>
</form>
<script>
    //檔案下載網址
    var url = "/Download.ashx";
    var a = document.getElementById("download_btn");
    //index為要下載的檔案編號,使用QueryString方式加入網址後方
    a.href = url + "?index=2";
    //如果想要另開視窗可加上target
    //a.target = "_blank";
</script>
3. 後端程式使用泛型處理常式
public class Download : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var index = context.Request.Params["index"];
        var fileName = "測試檔案" + index + ".xlsx";
        
        //取得檔案在Server上的實體路徑
        var filePath = context.Server.MapPath("~/File/" + fileName);
        //讀取檔案並將檔案轉成二進制內容
        var output = new byte[0];
        using (var fs = new FileStream(filePath, 
            FileMode.Open, FileAccess.Read))
        {
            output = new byte[(int)fs.Length];
            fs.Read(output, 0, output.Length);
        }
        //將檔案輸出到瀏覽器
        context.Response.Clear();
        context.Response.AddHeader(
            "Content-Length", output.Length.ToString());
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader(
            "content-disposition", 
            "attachment; filename=" + fileName);
        context.Response.OutputStream.Write(output, 0, output.Length);
        context.Response.Flush();
        context.Response.End();
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
結果:
結語:
下一篇介紹大型檔案下載的方式。
相關文章:
[C#] ASP.NET 檔案下載(1) - POST 和 GET 觸發檔案下載
[C#] ASP.NET 檔案下載(2) - 大型檔案下載
[C#] ASP.NET 檔案下載(3) - 檔案續傳
你也是用Webform配JS和AJAX的方式POST到ashx處理資料哦
對阿,我習慣這種作法,所以很少用控制項,都是用 ashx 處理完後回傳 JSON,前端再用 JS 處理 XD
我們公司也是耶!!!!看來以後有人可以交流了XD
哈哈,歡迎喔~